﻿namespace Devonline.AspNetCore;

/// <summary>
/// 图片服务接口
/// </summary>
public interface IImageService : IFileService
{
    /// <summary>
    /// 根据指定分辨率获取缩放后的文件名
    /// </summary>
    /// <param name="fileName">原始文件名</param>
    /// <param name="width">宽度</param>
    /// <param name="height">高度</param>
    /// <returns></returns>
    /// <exception cref="DirectoryNotFoundException"></exception>
    string GetResizeFileName(string fileName, int width, int height);
    /// <summary>
    /// 制作图片文件裁剪图, 当且仅当只有原图片尺寸大于裁剪图尺寸时才会生成裁剪图
    /// </summary>
    /// <param name="fileName">图片对象</param>
    /// <param name="width">最大宽度</param>
    /// <param name="height">最大高度</param>
    /// <exception cref="FileNotFoundException"></exception>
    string Resize(string fileName, int width, int height);

    /// <summary>
    /// 根据图片文件名和水印设置添加水印
    /// </summary>
    /// <param name="fileName">图片文件名</param>
    /// <returns></returns>
    string AddWatermark(string fileName);

    /// <summary>
    /// 向照片添加信息
    /// </summary>
    /// <param name="fileName">照片文件路径</param>
    /// <returns></returns>
    string AddInformation(string fileName);
    /// <summary>
    /// 从照片中获取信息
    /// </summary>
    /// <param name="fileName">照片文件路径</param>
    /// <returns></returns>
    string GetInformation(string fileName);

    /// <summary>
    /// 根据分辨率和格式重命名图片文件
    /// 格式说明: D: 目录名, R: 分辨率, F: 文件名, 其余部分只能是符号
    /// 格式示例: D/R/F -> 分辨率作为目录名后缀, 默认格式
    /// 格式示例: D/R_F -> 分辨率作为文件名前缀
    /// 格式示例: D/F_R -> 分辨率作为文件名后缀
    /// 格式示例: D_R_F -> 目录名, 分辨率都作为文件名前缀
    /// 格式示例: D(R)/F -> 分辨率作为目录名后缀
    /// </summary>
    /// <param name="imageFileName">图片文件名</param>
    /// <param name="outPath">输出目录</param>
    /// <param name="format">文件命名格式</param>
    /// <returns>输出文件名</returns>
    /// <exception cref="Exception"></exception>
    string Rename(string imageFileName, string? outPath = default, string? format = default);
}